<?php

namespace app\api\model;

use app\plan\controller\News;
use think\Cache;
use think\Env;
use think\Model;

class Information extends Model
{
    // 开启自动写入时间戳字段
    protected $autoWriteTimestamp = 'int';
    // 定义时间戳字段名
    protected $createTime = 'createtime';
    protected $updateTime = 'updatetime';

    // 设置当前模型对应的完整数据表名称
    protected $table = 'sx_information';

    public function information($limit)
    {
        try {
            // 连接 Redis 服务器
            $redis = Cache::store('redis')->handler();

            // 检查 Redis 键是否存在
            $redisKey = 'news:hash:newlist';

            if ($redis->exists($redisKey)) {
                // 从redis中取出数据
                $stockData = $redis->hGetAll($redisKey);
                $result = [];
                foreach ($stockData as $value) {
                    // 切割成数组
                    $str = explode('|', $value);
                    // 修改数据格式
                    $stockInfo = [
                        'ctime' => $str[0],
                        'title' => $str[1],
                        'description' => $str[2],
                        'source' => $str[3],
                        'picUrl' => $str[4],
                        'url' => $str[5],
                    ];
                    $result[] = $stockInfo;
                }


                // 结果数限制
                if (isset($limit) && $limit != 0) {
                    $result = array_slice($result, 0, $limit, true);
                } else {
                    return false;
                }
            } else {
                // 添加redis锁
                $lockKey = 'news:lock';
                $isLock = $redis->setnx($lockKey, 1);

                // 检查是否获取到了redis锁
                if ($isLock) {
                    // 设置锁的过期时间为5秒钟，防止死锁
                    $redis->expire($lockKey, 5);

                    // 重新访问API来获取数据
                    $getNews = new News();
                    $result = $getNews->getNews();

                    // 释放redis锁
                    $redis->del($lockKey);
                }
            }
            return $result;
        } catch (\Exception $e) {
            return false;
        }
    }
}
